/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.sgc.view.mbean;

import com.brain.core.view.mbean.*;
import com.brain.core.common.UtilCore;
import com.brain.core.dto.ParametroDto;
import com.brain.core.exception.DAOException;
import com.brain.core.manager.RecursosManager;

import com.brain.sgc.dto.ArbolCompetenciaDto;
import com.brain.sgc.dto.PuestoDto;
import com.brain.sgc.manager.ArbolCompetenciaManager;
import com.brain.sgc.manager.PuestoManager;
import com.brain.sgc.view.util.ConstantesSgc;
import java.io.Serializable;
import java.util.List;
import javax.annotation.Resource;
import javax.faces.application.FacesMessage;
import javax.faces.event.ActionEvent;
import org.apache.log4j.Logger;
import org.primefaces.context.RequestContext;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 *
 * @author Indra
 */
@Controller("arbolCompetenciaMBean")
@Scope("session")
public class ArbolCompetenciaMBean extends GenericMBean implements Serializable {

    private static Logger logger = Logger.getLogger(ArbolCompetenciaMBean.class);
    @Resource
    private ArbolCompetenciaManager manager;
    @Resource
    private RecursosManager recursosManager;
    @Resource
    private PuestoManager puestoManager;
    private List<ArbolCompetenciaDto> lista;
    private ArbolCompetenciaDto dtoFiltro;
    private ArbolCompetenciaDto dto;
    private PuestoDto puestoDto;
    private String keyTitulo = "arbol.competencia.panel";
    private TreeNode arbolCompetencia;
    private TreeNode selectedArbolCompetencia;
    private ArbolCompetenciaDto arbolCompetenciaPrincipal;
    private ArbolCompetenciaDto arbolCompetenciaSeleccionadoDto;
    @Autowired
    private ApplicationMBean applicationMBean;
    @Autowired
    private SessionMBean sessionMBean;

    public ArbolCompetenciaMBean() {
        this.dtoFiltro = new ArbolCompetenciaDto();
    }

    public String iniciar() {
        this.dto = null;
        this.lista = null;
        this.dtoFiltro = new ArbolCompetenciaDto();
        return ConstantesSgc.UrlNavegacion.URL_LISTA_ARBOL_COMPETENCIA;
    }

    public void buscar() {
        try {
            this.arbolCompetenciaPrincipal = this.manager.obtenerPropPrincipal(this.puestoDto.getId());
            this.arbolCompetencia = cargarArbolCompetencia(this.arbolCompetenciaPrincipal);
            this.arbolCompetencia.setExpanded(true);
            this.arbolCompetencia.setSelectable(false);
        } catch (DAOException ex) {
            showError("Error de Sistema", ex.getMessage());
        }
    }
    public void guardarEditado() {
        this.manager.guardar(this.dto);
        this.arbolCompetencia = cargarArbolCompetencia(this.arbolCompetenciaPrincipal);                 
        this.buscar();
    }
    public void guardar() {
        try {       
            int totalPorNodo = this.manager.obtenerListaPorPadreTotal(this.arbolCompetenciaSeleccionadoDto.getId());
            if(this.dto.getTipo()==null)
            {showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.clave"));}
            else if(this.dto.getTipo().equals(ConstantesSgc.ValoresConstantes.ARBOL_COMPETENCIA_FUNCION_PRINCIPAL)){
                    if(totalPorNodo!=ConstantesSgc.ValoresDefecto.ARBOL_COMPETENCIA_FUNCION_PRINCIPAL_TOTAL){
                     this.manager.guardar(this.dto);
                     this.arbolCompetencia = cargarArbolCompetencia(this.arbolCompetenciaPrincipal);
                    }}
            else if(this.dto.getTipo().equals(ConstantesSgc.ValoresConstantes.ARBOL_COMPETENCIA_UNIDADES_COMPETENCIA)){
                    if(totalPorNodo!=ConstantesSgc.ValoresDefecto.ARBOL_COMPETENCIA_UNIDAD_DE_COMPETENCIA){
                     this.manager.guardar(this.dto);
                     this.arbolCompetencia = cargarArbolCompetencia(this.arbolCompetenciaPrincipal);
                    }}
            else if(this.dto.getTipo().equals(ConstantesSgc.ValoresConstantes.ARBOL_COMPETENCIA_ELEMENTO)){
                    if(totalPorNodo!=ConstantesSgc.ValoresDefecto.ARBOL_COMPETENCIA_ELEMENTO_DE_COMPETENCIA){
                            this.manager.guardar(this.dto);
                            cambioEstadoPuestoHabilitado();
                            for (int i = 1; i <= ConstantesSgc.ValoresDefecto.ARBOL_COMPETENCIA_CANTIDAD_TIPO_DE_ELEMENTO; i++) {
                                if (i == 1) {
                                    tipoElemento("criterio", (long) i);
                                } else if (i == 2) {
                                    tipoElemento("evidencia", (long) i);
                                } else if (i == 3) {
                                    tipoElemento("conocimiento", (long) i);
                                } else {
                                    tipoElemento("campo", (long) i);
                                }
                            }
                    }}
            else if(this.dto.getTipo().equals(ConstantesSgc.ValoresConstantes.ARBOL_COMPETENCIA_TIPO_ELEMENTO)){
                    if(totalPorNodo!=ConstantesSgc.ValoresDefecto.ARBOL_COMPETENCIA_CANTIDAD_TIPO_DE_ELEMENTO){
                     this.manager.guardar(this.dto);
                     this.arbolCompetencia = cargarArbolCompetencia(this.arbolCompetenciaPrincipal);
                    }}
            else{ this.manager.guardar(this.dto);}
        
        } catch (DAOException ex) {
            logger.error("ERROR DE SISTEMA", ex);
            showError(ex.getMessage());
        }
        this.buscar();
    }
    public void tipoElemento(String mensaje, long numeracion) {
        ArbolCompetenciaDto newArbolCompetenciaDto = new ArbolCompetenciaDto();
        this.arbolCompetencia = cargarArbolCompetencia(this.arbolCompetenciaPrincipal);
        newArbolCompetenciaDto.setDescripcion(UtilCore.Internacionalizacion.getMensajeInternacional("arbol.competencia.tipo.elemento." + mensaje));
        newArbolCompetenciaDto.setTipo(ConstantesSgc.ValoresConstantes.ARBOL_COMPETENCIA_TIPO_ELEMENTO);
        newArbolCompetenciaDto.setPuestoDto(puestoDto);
        newArbolCompetenciaDto.setNumeracion(numeracion);
        newArbolCompetenciaDto.setArbolCompetenciaDtoPadreDto(this.dto);
        this.manager.guardar(newArbolCompetenciaDto);
    }

    public void cambioEstadoPuestoHabilitado() {
        try {            
            this.puestoDto.setEstadoDto(new ParametroDto(ConstantesSgc.Parametro.PUESTO_ESTADO_HABILITADO));
            this.puestoManager.editar(this.puestoDto);

        } catch (DAOException ex) {
            logger.error("ERROR DE SISTEMA", ex);
            showError(ex.getMessage());
        }

    }

    public String retroceder() {
        sessionMBean.setAccion(ConstantesSgc.Formulario.LISTA);
        sessionMBean().setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean().getAccion()));
        return ConstantesSgc.UrlNavegacion.URL_LISTA_ARBOL_COMPETENCIA;
    }

    private TreeNode cargarArbolCompetencia(ArbolCompetenciaDto arbolCompetenciaPrincipal) {

        TreeNode nodoDefecto = new DefaultTreeNode(new ArbolCompetenciaDto(), null);
        nodoDefecto.setExpanded(true);
        //nodoDefecto.setSelectable(false);
        TreeNode nodoInicial = new DefaultTreeNode(arbolCompetenciaPrincipal, nodoDefecto);
        nodoInicial.setExpanded(true);
        //nodoInicial.setSelectable(false);
        recursividadArbol(nodoInicial);
        return nodoDefecto;
    }

    TreeNode recursividadArbol(TreeNode tree) {
        ArbolCompetenciaDto inicial = (ArbolCompetenciaDto) tree.getData();
        List<ArbolCompetenciaDto> hijos = inicial.getListaHijos();
        if (hijos != null && hijos.size() != 0) { //tiene hijos
            UtilCore.General.ordena(hijos, "descripcion");
            for (ArbolCompetenciaDto x : hijos) {

                TreeNode t1 = new DefaultTreeNode(x, tree);
                t1.setExpanded(true);
                recursividadArbol(t1);
            }
        }
        return null;
    }

    public void editarArbolCompetencia() {
        this.arbolCompetenciaSeleccionadoDto = (ArbolCompetenciaDto) selectedArbolCompetencia.getData();
        this.dto = this.arbolCompetenciaSeleccionadoDto;
        if(this.arbolCompetenciaSeleccionadoDto.getTipo().equals(ConstantesSgc.ValoresConstantes.ARBOL_COMPETENCIA_TIPO_ELEMENTO)) {
             FacesMessage msg = null;
             RequestContext context = RequestContext.getCurrentInstance();
             showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.tipo.editar"));
             boolean loggedIn = true;
             context.addCallbackParam("loggedIn", loggedIn);
          }
        sessionMBean.setAccion(ConstantesSgc.Formulario.EDITAR);
        
    }

    public void nuevoArbolCompetencia() {
        this.arbolCompetenciaSeleccionadoDto = (ArbolCompetenciaDto) selectedArbolCompetencia.getData();
        this.dto = new ArbolCompetenciaDto();
        this.dto.setArbolCompetenciaDtoPadreDto(this.arbolCompetenciaSeleccionadoDto);
        if (this.arbolCompetenciaSeleccionadoDto.getArbolCompetenciaDtoPadreDto() == null) {
            validaciondeHijos(ConstantesSgc.ValoresConstantes.ARBOL_COMPETENCIA_FUNCION_PRINCIPAL, "clave", ConstantesSgc.ValoresDefecto.ARBOL_COMPETENCIA_FUNCION_PRINCIPAL_TOTAL);
        } else if (this.arbolCompetenciaSeleccionadoDto.getTipo().equals(ConstantesSgc.ValoresConstantes.ARBOL_COMPETENCIA_FUNCION_PRINCIPAL)) {
            validaciondeHijos(ConstantesSgc.ValoresConstantes.ARBOL_COMPETENCIA_UNIDADES_COMPETENCIA, "unidad", ConstantesSgc.ValoresDefecto.ARBOL_COMPETENCIA_UNIDAD_DE_COMPETENCIA);
        } else if (this.arbolCompetenciaSeleccionadoDto.getTipo().equals(ConstantesSgc.ValoresConstantes.ARBOL_COMPETENCIA_UNIDADES_COMPETENCIA)) {
            validaciondeHijos(ConstantesSgc.ValoresConstantes.ARBOL_COMPETENCIA_ELEMENTO, "elemento", ConstantesSgc.ValoresDefecto.ARBOL_COMPETENCIA_ELEMENTO_DE_COMPETENCIA);
        } else if (this.arbolCompetenciaSeleccionadoDto.getTipo().equals(ConstantesSgc.ValoresConstantes.ARBOL_COMPETENCIA_ELEMENTO)) {
            validaciondeHijos(ConstantesSgc.ValoresConstantes.ARBOL_COMPETENCIA_TIPO_ELEMENTO, "tipo", ConstantesSgc.ValoresDefecto.ARBOL_COMPETENCIA_CANTIDAD_TIPO_DE_ELEMENTO);
        } else if (this.arbolCompetenciaSeleccionadoDto.getTipo().equals(ConstantesSgc.ValoresConstantes.ARBOL_COMPETENCIA_TIPO_ELEMENTO)) {
            validaciondeHijos(ConstantesSgc.ValoresConstantes.ARBOL_COMPETENCIA_CONDUCTA_ELEMENTO, "tipo", ConstantesSgc.ValoresDefecto.ARBOL_COMPETENCIA_CONDUCTA);
        } else { 
            validaciondeHijos(ConstantesSgc.ValoresConstantes.ARBOL_COMPETENCIA_CONDUCTA_ELEMENTO, "conducta", ConstantesSgc.ValoresDefecto.ARBOL_COMPETENCIA_CONDUCTA_AUX);}
        sessionMBean.setAccion(ConstantesSgc.Formulario.NUEVO);
    }

    public void validaciondeHijos(String Tipo, String Mensaje, Long TotalPorNodo) {
        int totalPorNodo = 0;
        FacesMessage msg = null;
        RequestContext context = RequestContext.getCurrentInstance();
        try {
            totalPorNodo = this.manager.obtenerListaPorPadreTotal(this.arbolCompetenciaSeleccionadoDto.getId());
            if (totalPorNodo == TotalPorNodo || TotalPorNodo==ConstantesSgc.ValoresDefecto.ARBOL_COMPETENCIA_CONDUCTA_AUX) {
                showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion." + Mensaje));
                boolean loggedIn = true;
                context.addCallbackParam("loggedIn", loggedIn);
            } else {
                boolean loggedIn = false;
                context.addCallbackParam("loggedIn", loggedIn);
                this.dto.setTipo(Tipo);
                this.dto.setPuestoDto(puestoDto);
                this.dto.setNumeracion(totalPorNodo + 1L);
            }
        } catch (DAOException ex) {
            logger.error("ERROR DE SISTEMA", ex);
            showError(ex.getMessage());
        }
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        ArbolCompetenciaMBean.logger = logger;
    }

    public ArbolCompetenciaManager getManager() {
        return manager;
    }

    public void setManager(ArbolCompetenciaManager manager) {
        this.manager = manager;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public List<ArbolCompetenciaDto> getLista() {
        return lista;
    }

    public void setLista(List<ArbolCompetenciaDto> lista) {
        this.lista = lista;
    }

    public ArbolCompetenciaDto getDto() {
        return dto;
    }

    public void setDto(ArbolCompetenciaDto dto) {
        this.dto = dto;
    }

    public String getKeyTitulo() {
        return keyTitulo;
    }

    public void setKeyTitulo(String keyTitulo) {
        this.keyTitulo = keyTitulo;
    }

    public TreeNode getArbolCompetencia() {
        return arbolCompetencia;
    }

    public void setArbolCompetencia(TreeNode arbolCompetencia) {
        this.arbolCompetencia = arbolCompetencia;
    }

    public TreeNode getSelectedArbolCompetencia() {
        return selectedArbolCompetencia;
    }

    public void setSelectedArbolCompetencia(TreeNode selectedArbolCompetencia) {
        this.selectedArbolCompetencia = selectedArbolCompetencia;
    }

    public ArbolCompetenciaDto getArbolCompetenciaPrincipal() {
        return arbolCompetenciaPrincipal;
    }

    public void setArbolCompetenciaPrincipal(ArbolCompetenciaDto arbolCompetenciaPrincipal) {
        this.arbolCompetenciaPrincipal = arbolCompetenciaPrincipal;
    }

    public ArbolCompetenciaDto getArbolCompetenciaSeleccionadoDto() {
        return arbolCompetenciaSeleccionadoDto;
    }

    public void setArbolCompetenciaSeleccionadoDto(ArbolCompetenciaDto arbolCompetenciaSeleccionadoDto) {
        this.arbolCompetenciaSeleccionadoDto = arbolCompetenciaSeleccionadoDto;
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public SessionMBean getSessionMBean() {
        return sessionMBean;
    }

    public void setSessionMBean(SessionMBean sessionMBean) {
        this.sessionMBean = sessionMBean;
    }

    public PuestoDto getPuestoDto() {
        return puestoDto;
    }

    public void setPuestoDto(PuestoDto puestoDto) {
        this.puestoDto = puestoDto;
    }
}
